package com.example.transactionTemplate;

import com.example.domain.ExportTask;
import com.example.service.ExportTaskServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class TranSactionTemplateController {

    @Autowired
    private TransactionTemplate transactionTemplate;
    @Autowired
    private ExportTaskServiceImpl exportTaskService;

    @Autowired
    private PlatformTransactionManager transactionManager;

    /**
     * 通过transactionTemplate实现编程式事务（推荐）
     * @return
     */
    @RequestMapping(value = "/test/transactionTemplate" )
    public String templateTest()  {
        /**
         *  第一种写法
         */
        Object execute = transactionTemplate.execute(new TransactionCallback() {
            /**
             * @param transactionStatus 事务运行状态信息 是否是新事务、是否已被标记为回滚等
             * @return
             */
            @Override
            public Object doInTransaction(TransactionStatus transactionStatus) {
                Object result;
                try {
                    log.info("执行事务方法");
                    ExportTask ter = new ExportTask();
                    ter.setTaskName("111");
                    result = exportTaskService.save(ter);
                    // 手动设置异常
//                    int i = 1 / 0;
                    log.info("正常执行完成");
                    return result;
                } catch (Exception exception) {
                    log.info("执行事务异常，需要回滚:{}",exception.getMessage());
                    transactionStatus.setRollbackOnly();
                    return false;
                }
            }
        });
        /**
         * 第二种写法
         */
        // 开始编程式事务2 （函数式写法）
        Boolean count = transactionTemplate.execute((transactionStatus) ->{
            ExportTask ter1 = new ExportTask();
            ter1.setTaskName("111");
            boolean save = exportTaskService.save(ter1);
            if (save) {
                throw new RuntimeException("测试事务回滚！抛出异常也行");
            }
            return save;
        });


        return "success";
    }

    /***
     * 通过PlatformTransactionManager实现编程式事务（不推荐）
     */
    @RequestMapping(value = "/test/manageTest" )
    void manageTest()  {
        //事务基础信息 超时时间、隔离级别、传播属性等
        DefaultTransactionDefinition transDef = new DefaultTransactionDefinition(); // 定义事务属性
        // 设置传播行为属性， 默认事务级别。 当前无事务则新建事务，已有事务则加入事务。
        transDef.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
        // 获得事务状态
        TransactionStatus status = transactionManager.getTransaction(transDef);
        try {
            log.info("执行事务方法");
            ExportTask ter = new ExportTask();
            ter.setTaskName("333");
             exportTaskService.save(ter);
            //手动设置异常
            int i = 1 / 0;
            transactionManager.commit(status);// 提交
        } catch (Exception e) {
            log.info("执行事务异常，需要回滚");
            transactionManager.rollback(status);// 回滚
        }
    }


}
